package biblioes;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * Clase que se encarga de la transferencia de informacion de puntajes entre
 * el juego y los archivos correspondientes. Ademas es la responsable de hacer
 * transparente al usuario el manejo de los puntajes.
 */

public class ArchivoPuntaje {
	
	/**
	 * Se encarga de levantar un archivo con puntajes para ser mostrado mas
	 * adelante al usuario.
	 * 
	 * @param nivel archivo del cual se van a levantar los valores.
	 * @return String la linea con la informacion.
	 * @throws IOException si hubiera error en la lectura.
	 */

	public static String[] cargarPuntaje(File nivel) throws IOException {
		if(nivel.exists() == false) {
			nivel.createNewFile();
		}

		BufferedReader lector = new BufferedReader(new FileReader(nivel));
		String[] retorno = new String[11];
		String linea = "";
		int i = 0;
		
		try {
			while(linea != null) {
				linea = lector.readLine();
				if(linea != null) {
					retorno[i++] = linea;
				}
			}
		} finally {
			if(lector != null) {
				lector.close();
			}
		}		
		return retorno;
	}
	
	/**
	 * Se encarga de delegar a la funcion correspondiente de carga de puntajes, 
	 * segun sea un archivo de puntajes existente o nuevo.
	 * 
	 * @param nivel nombre del nivel para saber donde guardar los puntajes.
	 * @param jugador nombre del jugador que gano el nivel.
	 * @param puntos puntos conseguidos por el jugador.
	 * @throws IOException si hubiera error en la lectura o escritura.
	 */
	
	public static void guardarPuntajes(String nivel, String jugador, int puntos) throws IOException {
		File myDir = new File("./archivos");
		File myFile = new File(myDir, nivel + ".scores");
		try {
			if(myFile.exists() == false) {
				guardarPuntajesNuevo(myFile, jugador, puntos);
			} else {
				guardarPuntajesAgrega(myFile, jugador, puntos);
			}
		} catch(Exception e) {
			myFile.delete();
			throw new IOException();
		}
	}
	
	/**
	 * Se encarga de agregar en un archivo de puntajes ya existente el record logrado
	 * por el jugador actual.
	 * 
	 * @param nivel nombre del nivel para saber donde guardar los puntajes.
	 * @param jugador nombre del jugador que gano el nivel.
	 * @param puntos puntos conseguidos por el jugador.
	 * @throws IOException si hubiera error en la lectura o escritura.
	 */
	
	public static void guardarPuntajesAgrega(File nivel, String jugador, int puntos) throws IOException {
		BufferedReader lector = new BufferedReader(new FileReader(nivel));
		String[] puntajes = new String[11];
		String linea = "";
		int i = 0;
		while(i < 11 && linea != null) {
			linea = lector.readLine();
			if(linea != null) {
				puntajes[i++] = linea;
			}
		}
		if(lector != null) {
			lector.close();
		}

		BufferedWriter escritor = new BufferedWriter(new FileWriter(nivel));

		FormatoPuntaje resultado = new FormatoPuntaje(puntajes);
		puntajes = resultado.agregaOrdenado(jugador, ((Integer)puntos).toString());

		for(int j = 0; j < 11 && puntajes[j] != null; j++) {
			escritor.write(puntajes[j]);
			escritor.write("\n");
		}
		if(escritor != null) {
			escritor.close();
		}
	}
	
	/**
	 * Se encarga de crear un archivo de puntajes con el nombre correspondiente y
	 * registrar alli el puntaje logrado por el jugador.
	 * 
	 * @param nivel nombre del nivel para saber donde guardar los puntajes.
	 * @param jugador nombre del jugador que gano el nivel.
	 * @param puntos puntos conseguidos por el jugador.
	 * @throws IOException si hubiera error en la lectura o escritura.
	 */
	
	public static void guardarPuntajesNuevo(File nivel, String jugador, int puntos) throws IOException {
		nivel.createNewFile();
		BufferedWriter file = new BufferedWriter(new FileWriter(nivel));
		file.write(nivel.getName().split("\\.")[0]);
		file.write("\n");
		file.write("1. " + jugador + " " + puntos);
		if(file != null) {
			file.close();
		}
	}
	
}
